package com.richpay.basejava.base11;

/**
 * abstract：抽象的，如果修饰类，则这个类是抽象类，抽象类最显著的特点:不能实例化对象。
 * 抽象类中移动有抽象方法吗？不一定。
 * 含有抽象方法的类一定是抽象类吗？是。
 *
 * 抽象类和普通类相比：除了不能实例化对象，可以含有抽象方法外，其他的和普通类没有什么区别。
 *
 * 抽象类中可以由构造器吗？可以，抽象类中的构造器天生是在实例化子类对象时由子类构造方法调用的。
 *
 * 一个类继承了抽象类，则必须实现抽象类中的所有抽象方法，否则这个子类也是抽象类。
 *
 * 构造方法不能是抽象方法。
 * 静态方法不能是抽象方法，因为静态方法可以直接使用类名进行调用，而调用抽象方法无法提供具体的功能。
 *
 * 私有的方法不能是抽象方法，因为私有方法不能被子类继承，无法提供实现。
 * final方法不能是抽象方法，因为final方法不能被重写，而抽象方法提供的目的就是为了在子类中进行重写。
 */
public abstract class Animal {
    /**
     * 使用abstract修饰的方法并且没有方法体的方法为抽象方法;抽象方法没有方法体
     */
    public abstract void eat();

    public abstract void sleep();

    //public abstract Animal();//错误，构造函数不能是抽象的，因为抽象方法必须在子类中实现，而构造函数不能被继承，无法进行实现.

    // public static abstract void show();/错误：非法的修饰符组合：abstract 和 static

    public void drink() {
        System.out.println("动物喝");
    }
}
